package fa7.socialcode.model;

import java.io.Serializable;
import java.util.Date;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

@Entity
public class Usuario implements Serializable {

  /**
   * 
   */
  private static final long serialVersionUID = 1L;
  // variaveis
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;
  private String nome;
  private String email;
  private String nacionalidade;
  private String profissao;
  private String formacao;
  private String atividades;
  private String imagem;
  private Date dataNascimento;
  private Date dataAssociacao;

  // Relacionamentos

  private Set<Usuario> amigos;
  private Papel papel;
  private Set<Topico> meusTopicos;
  private Set<Comunidade> minhasComunidades;
  private Set<Avaliacao> minhasAvaliacoes;
  private Set<Comentario> meusComentarios;
  private Set<Conteudo> meusConteudos;
  private Set<Noticia> minhasNoticias;
  private Set<Duvida> duvidas;
  private Set<Resposta> respostas;

  // GETTERS com annotations
  @OneToMany(targetEntity=Usuario.class,
      cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "id_usuario")
  public Set<Usuario> getAmigos() {
    return amigos;
  }

  @ManyToOne(optional = false, fetch = FetchType.LAZY)
  @JoinColumn(name = "id_papel", nullable = false)
  public Papel getPapel() {
    return papel;
  }

  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "id_usuario")
  public Set<Topico> getMeusTopicos() {
    return meusTopicos;
  }

  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "id_usuario")
  public Set<Comunidade> getMinhasComunidades() {
    return minhasComunidades;
  }

  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "id_usuario")
  public Set<Avaliacao> getMinhasAvaliacoes() {
    return minhasAvaliacoes;
  }

  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "id_usuario")
  public void setMeusComentarios(Set<Comentario> meuComentarios) {
    this.meusComentarios = meuComentarios;
  }

  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "id_usuario")
  public Set<Conteudo> getMeusConteudos() {
    return meusConteudos;
  }

  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "id_usuario")
  public Set<Noticia> getMinhasNoticias() {
    return minhasNoticias;
  }

  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "id_usuario")
  public Set<Duvida> getDuvidas() {
    return duvidas;
  }

  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "id_usuario")
  public Set<Resposta> getRespostas() {
    return respostas;
  }

  // SETTERS
  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public String getNome() {
    return nome;
  }

  public void setNome(String nome) {
    this.nome = nome;
  }

  public String getEmail() {
    return email;
  }

  public void setEmail(String email) {
    this.email = email;
  }

  public String getNacionalidade() {
    return nacionalidade;
  }

  public void setNacionalidade(String nacionalidade) {
    this.nacionalidade = nacionalidade;
  }

  public String getProfissao() {
    return profissao;
  }

  public void setProfissao(String profissao) {
    this.profissao = profissao;
  }

  public String getFormacao() {
    return formacao;
  }

  public void setFormacao(String formacao) {
    this.formacao = formacao;
  }

  public String getAtividades() {
    return atividades;
  }

  public void setAtividades(String atividades) {
    this.atividades = atividades;
  }

  public String getImagem() {
    return imagem;
  }

  public void setImagem(String imagem) {
    this.imagem = imagem;
  }

  public Date getDataNascimento() {
    return dataNascimento;
  }

  public void setDataNascimento(Date dataNascimento) {
    this.dataNascimento = dataNascimento;
  }

  public Date getDataAssociacao() {
    return dataAssociacao;
  }

  public void setDataAssociacao(Date dataAssociacao) {
    this.dataAssociacao = dataAssociacao;
  }

  public void setAmigos(Set<Usuario> amigos) {
    this.amigos = amigos;
  }

  public void setPapel(Papel papel) {
    this.papel = papel;
  }

  public void setMeusTopicos(Set<Topico> meusTopicos) {
    this.meusTopicos = meusTopicos;
  }

  public void setMinhasComunidades(Set<Comunidade> minhasComunidades) {
    this.minhasComunidades = minhasComunidades;
  }

  public void setMinhasAvaliacoes(Set<Avaliacao> minhasAvaliacoes) {
    this.minhasAvaliacoes = minhasAvaliacoes;
  }

  public Set<Comentario> getMeusComentarios() {
    return meusComentarios;
  }

  public void setMeusConteudos(Set<Conteudo> meusConteudos) {
    this.meusConteudos = meusConteudos;
  }

  public void setDuvidas(Set<Duvida> duvidas) {
    this.duvidas = duvidas;
  }

  public void setMinhasNoticias(Set<Noticia> minhasNoticias) {
    this.minhasNoticias = minhasNoticias;
  }

  public void setRespostas(Set<Resposta> respostas) {
    this.respostas = respostas;
  }

}
